//==============  Pile d'objets ======================'
function Pile(tInit){
//=================
     if (tInit)
       this.t = tInit;    // attention il ne s'agit pas d une copie
     else
       this.t = new Array;
}


Pile.prototype.push = function (nvElt){
//=================
     this.t.push(nvElt);
}

Pile.prototype.pop = function (){
//================
     this.t.pop();
}

Pile.prototype.at = function (index){
//================
     this.t[index];
}

Pile.prototype.add = function (elt){
//================
  if (!this.curseurSur(elt))
     this.push(elt);
}

Pile.prototype.remove = function (elt){
//===================
if (this.top() == elt)
  this.pop();

else{
  if (this.curseurSur(elt))
     this.t.splice(this.indCourant,1)[0];
}
return this.length();
}

Pile.prototype.onTop = function (eltPromu){
//==================
//traceAct('onTop ','entree')
     // rech de l element
     if (this.t[this.indCourant] == eltPromu){
        var i=this.indCourant;
        bEltPresent = true;
        //traceAct('onTop trouve pos indCourant');
        //var oldTop = this.top();
        }
     else
     {
        //var oldTop = this.top();
        //a tester : curseurSur(eltPromu);
        //traceAct('onTop parcours deb');
        var i = 0;
        var bEltPresent = false;
        while (   !bEltPresent
            && (i < this.t.length)){
            if (this.t[i] == eltPromu)
                bEltPresent = true;
            else
                i++;
         }
        //traceAct('onTop parcours fin');
     }
     // elt trouve : extraction + push
     if (bEltPresent)
//         this.t.push(this.t.splice(i,1)[0]);
         {this.push(this.t.splice(i,1)[0]);
         //traceAct('onTop ','d?ja ');
     }
     // elt non trouve : push
     else
//         this.t.push(eltPromu);
         {this.push(eltPromu);
         //traceAct('onTop ','nv ');
     }

//traceAct('onTop ','pos i (t[i])= ',i)
//traceAct('onTop ','elt.id= ',this.t[this.length()-1].id);
//traceAct('onTop ','sortie')
     return;// oldTop;
}

Pile.prototype.length = function (){
//===================
     return this.t.length;
}

Pile.prototype.top = function (){
//================
     if (this.t.length == 0)
        this.indCourant = 0;
     else
        this.indCourant = this.t.length-1;
     return this.t[this.indCourant];
}

Pile.prototype.bottom = function (){
//===================
     this.indCourant = 0;
     return this.t[this.indCourant];
}

Pile.prototype.curseurSur = function(elt){
//=======================
// positionne le curseur sur l'elt <elt> s'il se trouve  dans la pile (ou sur la 1ere position libre sinon)
// renvoi un t?moin logique de sa pr?sence/absence
//traceAct('curseurSur',' entree');
//traceAct('curseurSur',' rech elt.id ',elt.id);
     var i = 0;
     var bEltPresent = false;
     while (   !bEltPresent
            && (i < this.t.length)){
            if (this.t[i] == elt)
                bEltPresent = true;
            else
                i++;
     }
     this.indCourant = i;
//traceAct('curseurSur',' indCourant=',this.indCourant);
//traceAct('curseurSur',' sortie');
     return bEltPresent;
}

Pile.prototype.next = function (bCirculaire){
//=================
// si la pile ne comprend qu'un elt retourne null,   (modif du 15/11/03 / fenetre a tester ds d autre utilisation)
// sinon retourne l' elt suivant sur la pile, vue ou non (bCirculaire) comme une pile circulaire.
traceExec('next bCirculaire='+bCirculaire,32);
traceExec('next length()='+this.length(),32);

   if (  bCirculaire
      && (this.length() > 1)) {
      this.indCourant = ++this.indCourant  % this.t.length;
      return  this.t[this.indCourant];
   }
   else
      return         ((this.indCourant + 1) <=this.t.length) ?
                        this.t[++this.indCourant]:
                        null;
                        
}

Pile.prototype.replaceCurrentVal= function (nvVal) {
//==============================
// a tester de fa?on + approfondie
  this.t[this.indCourant] = nvVal;
}

Pile.prototype.display = function (comportement){
//===================
//     var tTmp = this.t.slice(0,this.t.length);
     var disp = "";
     for (var i=0; i<this.t.length; i++){
//          var ob = tTmp.shift();
          var ob = this.t[i];
          if (ob.id)
              disp = disp + "\n"+i+' '+ob.id;
          else
              disp = disp + "\n"+i+' '+'id inconnu';
     }
     if (comportement == 'enRetour')
         return disp;
     else
         traceExec('Contenu de la pile ('+this.t.length+' elts):\n'+disp,44);
}

